package com.mgq.algorithm.forcerecursive;

/**
 * @author MaGuangQi
 * 给定一个整型数组arr，代表数值不同的纸牌排成一条线。 玩家A和玩家B依次拿走每张纸
 * 牌，规定玩家A先拿，玩家B后拿，但是每个玩家每次只能拿走最左或最右的纸牌，玩家A
 * 和玩家B都绝项聪明。请返回最后获胜者的分数。
 * [举例]
 * arr=[1,2, 100, 4]。
 * 开始时，玩家A只能拿走1或4。如果开始时玩家A拿走1，则排列变为[2, 100, 4]，接下来
 * 玩家B可以拿走2或4，然后继续轮到玩家A...
 * 如果开始时玩家A拿走4，则排列变为[1, 2, 100]，接下来玩家B可以拿走1或100，然后继
 * 续轮到玩家A....
 * 玩家A作为绝项聪明的人不会先拿4，因为拿4之后，玩家B将拿走100。所以玩家A会先拿1,
 * 让排列变为[2, 100, 4]，接下来玩家B不管怎么选，100都会被玩家A拿走。玩家A会获胜,
 * 分数为101。所以返回101。
 * arr=[1, 100, 2]。
 * 开始时，玩家A不管拿1还是2，玩家B作为绝顶聪明的人，都会把100拿走。玩家B会获胜，
 * 分数为100。所以返回100。
 * @date 2022-01-07 10:24
 **/
public class MaxScore {

    /**
     * 先手
     * @param arr
     * @param l l和r是范围(表示只能在这个范围上拿)
     * @param r
     * @return
     */
    public static int first(int[] arr, int l, int r) {
        //只剩一个了.先手肯定拿走了
        if (l == r) {
            return arr[l];
        }
        //全试
        //如果先拿走左边,剩余的就是 l+1,r
        //如果先拿走右边,剩余的就是l,r-1
        //先手+后手
        int i = arr[l] + second(arr, l + 1, r);
        int j=arr[r]+second(arr,l,r-1);
        //返回对自己最有利的分数
        return Math.max(i, j);
    }

    /**
     * 后手
     * @param arr
     * @param l
     * @param r
     * @return 返回对自己最有利的.
     */
    public static int second(int[] arr, int l, int r) {
        //只有一个数,后手,肯定那的是0了
        if (l == r) {
            return 0;
        }
        int left = first(arr, l + 1, r);
        int right = first(arr, l, r - 1);
        //因为先手肯定后把对自己最有利的拿走,
        return Math.min(left, right);
    }

    public static int win(int[] num) {
        if (num == null || num.length == 0) {
            return 0;
        }
        //first(num, 0, num.length - 1) 玩家A
        //second(num, 0, num.length - 1) 玩家B
        return Math.max(first(num, 0, num.length - 1), second(num, 0, num.length - 1));
    }

    public static void main(String[] args) {
        int[] array = new int[]{1, 100, 2};
        int win = win(array);
        System.out.println(win);
    }
}
